package daily_task

import (
	"go_server/game_server/api/service/bag"
	"go_server/game_server/dao/daily_dao"
	"go_server/game_server/dataconfig/config_manager"
	"go_server/game_server/protocol/pb"
	"go_server/game_server/util"
	"go_server/game_server/world_manager"
	"go_server/zinx/ziface"
	"go_server/zinx/znet"
	"time"
)

type GetDailyTaskChestPrizeApi struct {
	znet.BaseRouter
}

// Handle 处理获取每日任务宝箱奖励的请求。
// request: 接收到的请求对象，包含用户请求的相关数据。
func (*GetDailyTaskChestPrizeApi) Handle(request ziface.IRequest) {
	msg := &pb.GetDailyTaskChestPrizeC2S{}
	if !util.PBParseRet(request, msg) {
		return
	}

	conn := request.GetConnection()
	roleId := ServiceObj.GetRoleId(request)

	// 根据消息中的宝箱ID获取对应的配置信息。
	baseDailyChestInfo, ok := config_manager.GetStcTableActivityConfig_SheetActivityConfigById(msg.ChestId)
	if !ok {
		world_manager.WorldMgrObj.SendClientErrMsg(roleId, request, pb.ErrorCodeManager_DAILY_CHEST_UNFIND, nil)
		return
	}

	dateKey := time.Now().Format("20060102")
	fields := []string{"active", "chest_info"}
	row := daily_dao.GetDailyByDateKey(dateKey, roleId, fields)

	// 初始化变量用于存储当日活跃度和已领取宝箱ID集合。
	var active int32
	var hadGotChestIds []int32

	// 如果数据库中有当日数据，则赋值活跃度和已领取宝箱ID集合。
	if row != nil {
		active = row.Active
		hadGotChestIds = row.ChestInfo
	}

	// 如果当前活跃度不满足领取宝箱条件，处理错误情况。
	if active < baseDailyChestInfo.Value {
		world_manager.WorldMgrObj.SendClientErrMsg(roleId, request, pb.ErrorCodeManager_DAILY_CHEST_CANT_COMPLETE, nil)
		return
	}

	// 使用集合检查当前宝箱是否已领取。
	eventSet := util.NewSet[int32]()
	if hadGotChestIds != nil {
		eventSet.AddValue(hadGotChestIds)
		// 如果已领取，处理错误情况。
		if eventSet.Contains(msg.ChestId) {
			world_manager.WorldMgrObj.SendClientErrMsg(roleId, request, pb.ErrorCodeManager_DAILY_CHEST_HAD_GOT, nil)
			return
		}
	}

	// 更新宝箱领取状态。
	hadGotChestIds = append(hadGotChestIds, msg.ChestId)

	// 构造返回给客户端的响应数据，表示宝箱已领取。
	res := &pb.GetDailyTaskChestPrizeS2C{
		ChestId: msg.ChestId,
		State:   2, // 已领取
	}
	conn.SendBuffPBMsg(uint32(pb.ProtocolManager_GetDailyTaskChestPrize), res)

	// 更新数据库中的宝箱领取状态。
	dailyObj := daily_dao.Daily{
		DateKey:   dateKey,
		RoleId:    roleId,
		Active:    active,
		ChestInfo: hadGotChestIds,
	}
	daily_dao.UpdateDailyByDateKey(&dailyObj, fields)

	// 推送每日任务列表给客户端。
	msgS2C := ServiceObj.GetDailyTaskList.GetDailyTaskListApiS2C(roleId)
	conn.SendBuffPBMsg(uint32(pb.ProtocolManager_GetDailyTaskList), msgS2C)

	// 发送奖励物品给用户。
	bag.AddItemArrayInt32(roleId, baseDailyChestInfo.Reward)
}
